import http from './index';

const timeout = 60000; // 超时时间 官方默认3000      index.ts 设置了600000ms

let configTemp: any = {};
// 执行请求的方法
function request(config: any, retryTime: number) {
  configTemp = config;

  return http({
    ...config,
    // timeout,
  })
    .then((res) => {
      return Promise.resolve(res);
    })
    .catch((error) => {
      // 先解释一下，由于这里是在老项目中封装的，为了兼容之前写的项目不做调整，就在这里异常处理，其实index.ts中的catch完全可以放在这里处理
      console.log(error);
      if (error.includes('timeout'))
        if (retryTime >= 3) {
          // 重试次数超过了限制
        } else {
          retryTime++;
          request(configTemp, retryTime);
        }
      // if(code == 401)  如果token失效，想做无感刷新，在这里重新请求一次获取token，让token失效前正在请求还没有请求的接口保存在一个数组里面，等到token更新好，遍历数组将没有请求成功的接口继续请求，这里就可以实现无感刷新了
      return Promise.reject(error);
      // 使用 Promise.reject 手动抛出异常，让 Promise.all 并发请求的方法中的 catch 捕获该异常，从而实现重试机制
      // return Promise.reject(error);
    });
}

// 取消请求 具体参看官网
// const controller = new AbortController();
// const cancelAxios = () => {
//   controller.abort();
// };
let retryTime = 1; // 重试次数

/**
 * 封装 get 请求方法
 * @param url
 * @param params 对象
 * @param other 其他参数，（上传下载文件流，请求终止等参数） 比如  { responseType: 'blob' }  {   signal: controller.signal }
 * @returns
 */
export function get(url: string, params: any = {}, other?: any) {
  //删除无用的参数
  for (let key in params) if (!params[key] && params[key] !== false && params[key] !== 0) delete params[key];
  return request(
    {
      url,
      params,
      method: 'get',
      ...other,
    },
    retryTime,
  );
}

/**
 * 封装 post 请求方法
 * @param url
 * @param params 对象
 * @param other 其他参数，（上传下载文件流，请求终止等参数） 比如  { responseType: 'blob' }  {   signal: controller.signal }
 * @returns
 */
export function post(url: string, data: any = {}, other?: any) {
  for (let key in data) if (!data[key] && data[key] !== false && data[key] !== 0) delete data[key];
  return request(
    {
      url,
      data,
      method: 'post',
      ...other,
    },
    retryTime,
  );
}

// 封装 put 请求方法
export function put(url: string, data: any = {}) {
  for (let key in data) if (!data[key] && data[key] !== false && data[key] !== 0) delete data[key];
  return request(
    {
      url,
      data,
      method: 'put',
    },
    retryTime,
  );
}

// 封装 delete 请求方法
export function del(url: string, params: any = {}) {
  for (let key in params) if (!params[key] && params[key] !== false && params[key] !== 0) delete params[key];
  return request(
    {
      url,
      params,
      method: 'delete',
    },
    retryTime,
  );
}
